raster ou stack;list.files;for;gsub;assign;readOGR ou shapefile.crop e a função mask.bio_8_cortado <- crop(bio_8, shp)
bio_8_final <- mask(bio_8_cortado, shp)Vamos começar este roteiro fora do R, baixando dados de espécie diretamente dos repositórios digitais através do nosso navegador. Como vimos na aula teórica, é importante coletar dados de diferentes fontes para que nos aproximemos da suficiência amostral. Para esta aula, vamos juntar dados do SpeciesLink e do GBIF. Acesse os sites e siga o passo-a-passo para obter os dados da sua espécie. Aqui, vamos usar como exemplo a Ficus cestrifolia, a figueira-de-folha-miúda.
Começando pelo SpeciesLink, vamos acessar o site e abrir um formulário de busca, clicando no botão “abrir formulário de busca”.
Em seguida, no campo “nome científico” vamos indicar nossa espécie alvo e clicar em buscar.
O resultado da busca irá nos indicar algumas informações quanto ao número de registros, mas nem todos possuem coordenadas. Precisamos apenas de dados georeferenciados. Assim, vamos no menu “download”…
… e pedir para o SpeciesLink os dados prontos para serem utilizados no MaxEnt.
Ao carregar a próxima página, vamos finalmente realizar o download dos dados clicando no botão verde escrito “TXT”.
Note que alguns conjuntos de dados muito grandes podem requerer um pré-processamento por parte do site e são enviados a posteriori por e-mail. Note também que a tabela que baixamos está ótima já para gerarmos nossos modelos. A próxima não será tão fácil…
O Global Biodiversity Facility (GBIF) é um dos principais repositórios de dados da biodiversidade globais. Para acessar seus dados, seguimos basicamente o mesmo caminho do SpeciesLink. Acesse o site e no espaço de busca, pesquise pela espécie alvo:
A busca será feita por espécies dentro da base e pode gerar mais de uma espécie, como é o caso da Ficus cestrifolia. Seguimos, então, escolhendo aquela (ou aquelas) que julgamos ser mais adequada para o nosso trabalho.
Após entrarmos na espécie desejada, vamos clicar no botão verde escrito “OCCURRENCES” para mostrar os dados de ocorrência da espécie. Note que abaixo é possível vislumbrar um mapa de calor com os registros da espécie.
A seguir, clicamos em “DOWNLOAD” para abrir as opções de download dos dados.
Vamos selecionar a opção de download simples, clicando no botão verde escrito “SIMPLE”. Note que abaixo é possível vislumbrar algumas informações sobre os dados.
Finalmente, vamos baixar os dados clicando no botão verde escrito “DOWNLOAD”.
IMPORTANTE: Note que, com os dados baixados e descompactados, é possível trabalhar as tabelas usando o Excel, Numbers ou programa de planilha similar. Tendo em vista que esses programas possuem um uso mais intuitivo, nesse roteiro vou passar algumas informações sobre como fazer uma limpeza utilizando o R. Vejam que, para deixar a tabela do GBIF parecida com a tabela do SpeciesLink, é preciso um pouco de trabalho. Lembre-se de colocar as tabelas do GBIF e do SpeciesLink na pasta de trabalho para podermos acessar elas. Particularmente, sempre coloco os dados de presenças em uma sub-pasta chamada “spp_data”. O segredo da tabela do GBIF é manter apenas as colunas com os nomes: “species”,“decimalLatitude” e “decimalLongitude”; e deletar as linhas que não possuem coordenadas.
Utilizando o R, podemos importar as tabelas que baixamos com a função read.table ou read.csv, indicando o caminho até o arquivo.
gbif_data <- read.table("spp_data/0289538-200613084148143.csv", sep = "\t", header = T)
sl_data <- read.table("spp_data/speciesLink_all_15815.csv", sep = ",", header = F)Os dois objetos que acabamos de criar são chamados de data.frames. Podemos conferir isso rodando:
class(gbif_data)## [1] "data.frame"
class(sl_data)## [1] "data.frame"
Data.frames são matrizes de dados de diferentes classes. Ou seja, cada coluna do data.frame pode ter uma classe diferente. Para acessar as colunas nós podemos usar o $ ou acessar através das coordenadas: gbif_data[LINHAS,COLUNAS]. Assim, se queremos selecionar a primeira coluna inteira fazemos:
gbif_data[,1]Para acessar os dez primeiros valores da primeira coluna fazemos:
gbif_data[1:10,1]Os dez primeiros das colunas 1, 5 e 10:
gbif_data[1:10,c(1,5,10)]Também podemos selecionar as colunas por nome de duas formas:
gbif_data$species
gbif_data[,"species"]Vamos começar pelos dados do GBIF. Como vocês podem ver no painel do ambiente, existem 50 colunas na tabela. Isso torna extremamente difícil lidar com ela. Assim, vamos selecionar só as colunas que a gente realmente precisa. No GBIF essas colunas estão nomeadas como: “species”,“decimalLongitude” e “decimalLatitude”. Então fazemos assim:
gbif_data <- gbif_data[,c("species","decimalLongitude", "decimalLatitude")]Antes de limparmos os dados, vamos transformar nossos dois data.frames em um. Para isso, precisamos que suas colunas tenham os mesmos nomes. Para isso, utilizamos a função colnames, abreviação para “nomes de colunas”. Em seguida, unimos as tabelas usando a função rbind, abreviação para row bind, ou “juntar por linhas”. Nesse momento, precisamos ter cuidado para ter certeza de que as colunas estão na mesma ordem para não misturar os dados de latitude e longitude.
colnames(sl_data) <- colnames(gbif_data)
df <- rbind(gbif_data, sl_data)Um último item que precisamos alterar é o nome da espécie. Alguns registros apresentam o nome da espécie de forma levemente diferente. Vamos usar a função rep para replicar o nome da espécie ao longo da tabela. É importante alterar o nome da espécie para que não haja um espaço entre o gênero e o epíteto.
df$species <- rep("Ficus.cestrifolia", nrow(df))Com a nossa tabela em mãos, podemos excluir alguns registros já. Vamos começar com os registros que não possuem coordenada. Função mais óbvia aqui é na.omit.
df <- na.omit(df)Para eliminar aqueles registros com coordenadas em cima do equador ou de greenwich, precisamos usar alguns marcadores lógicos:
df$decimalLongitude == 0## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [37] FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE FALSE FALSE FALSE FALSE
## [49] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [61] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [73] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [85] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [97] FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE FALSE FALSE
## [109] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [121] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [133] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [145] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [157] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [169] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [181] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [193] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [205] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [217] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [229] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [241] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [253] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [265] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [277] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [289] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [301] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [313] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [325] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [337] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [349] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [361] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [373] FALSE FALSE
Perceba que, quando rodamos o código acima, o R retorna um vetor, isto é, um conjunto de valores, da classe logical. Ou seja, um conjunto de valores sendo eles falsos (FALSE) ou verdadeiros (TRUE). E o tamanho desse vetor é o mesmo que o número de linhas do objeto df. Dessa forma, podemos usar esse marcador para encontrar os registros com zeros, incluindo ele na posição das linhas, dessa forma:
df[df$decimalLongitude == 0,]## species decimalLongitude decimalLatitude
## 74 Ficus.cestrifolia 0 0
## 75 Ficus.cestrifolia 0 0
## 76 Ficus.cestrifolia 0 0
## 113 Ficus.cestrifolia 0 0
## 249 Ficus.cestrifolia 0 0
## 250 Ficus.cestrifolia 0 0
## 251 Ficus.cestrifolia 0 0
## 252 Ficus.cestrifolia 0 0
Assim percebemos que existem oito linhas com zero para a longitude. Para excluir essas linhas, podemos usar um marcador negativo. Em R, usamos o ! para colocar um não na nossa frase. Assim, se df$decimalLongitude == 0 significa “valores que são iguais a zero”, !df$decimalLongitude == 0 significa “valores que não são iguais a zero”.
df <- df[!df$decimalLongitude == 0,]Seguindo esta mesma lógica, podemos excluir qualquer coordenada que acharmos necessário, substituindo o 0 por qualquer valor que acharmos necessário ou o == por outros operadores, como os seguintes:
df[df$decimalLongitude >= 0,] # maior ou igual a zero
df[df$decimalLongitude < 0,] # menor do que zero
df[df$decimalLongitude == -43.00940 & df$decimalLatitude == -22.450600,] # & significa 'e'
df[df$decimalLongitude == -43.00940 | df$decimalLongitude == -44.56670,] # | significa 'ou'Para auxiliar, é possível plotar os pontos na forma de um mapa:
library(sp)
df2 <- df
coordinates(df2) <- c(2,3)
plot(df2)Como exemplo, vou excluir todas as coordenadas de -20 graus de latitude pra cima:
library(sp)
df <- df[df$decimalLatitude < -20,]
df2 <- df
coordinates(df2) <- c(2,3)
plot(df2)Duplicata, como vimos em aula, é um conceito que depende da resolução do raster ambiental. Sendo assim, é preciso definir a resolução antes de rodar esse passo. Imaginemos que, nesse caso, iremos usar um raster de 10 arc-minutos. Como já baixamos os dados do WorldClim 2.0 na última aula, vou importar um raster qualquer:
library(raster)
r <- raster("wc2.1_10m_bio/wc2.1_10m_bio_1.tif")
r## class : RasterLayer
## dimensions : 1080, 2160, 2332800 (nrow, ncol, ncell)
## resolution : 0.1666667, 0.1666667 (x, y)
## extent : -180, 180, -90, 90 (xmin, xmax, ymin, ymax)
## crs : +proj=longlat +datum=WGS84 +no_defs
## source : wc2.1_10m_bio_1.tif
## names : wc2.1_10m_bio_1
## values : -54.72435, 30.98764 (min, max)
plot(r)Para determinar se os pontos de presença estão em uma mesma célula, vou alterar os valores do raster para um número. Cada célula receberá um número diferente:
values(r) <- 1:ncell(r)
r## class : RasterLayer
## dimensions : 1080, 2160, 2332800 (nrow, ncol, ncell)
## resolution : 0.1666667, 0.1666667 (x, y)
## extent : -180, 180, -90, 90 (xmin, xmax, ymin, ymax)
## crs : +proj=longlat +datum=WGS84 +no_defs
## source : memory
## names : wc2.1_10m_bio_1
## values : 1, 2332800 (min, max)
plot(r)Agora, vamos criar uma nova coluna no nosso data.frame com o valor da célula em que o registro se encontra. Vamos usar a função extract que extrai o valor de um raster para uma dada coordenada. Depois vamos usar a função cbind, semelhante à função rbind que usamos antes, para unir colunas.
cell_id <- extract(r, df2)
df <- cbind(df,cell_id)Para ficar somente com um registro por célula, excluindo duplicatas, podemos utilizar a função duplicated para gerar um vetor lógico, assim como fizemos na seção Removendo coordenadas. ATENÇÃO: Essa função retorna quais valores são duplicados. Para manter valores que não são duplicados devemos usar o !.
nrow(df)## [1] 344
df <- df[!duplicated(df$cell_id),]
nrow(df)## [1] 125
df2 <- df
coordinates(df2) <- c(2,3)
plot(df2)Nessa etapa, tentei sintetizar alguns dos principais métodos pra preparar os nossos dados de presença para a modelagem. Lembre-se de sempre buscar dados no maior número de bases possível e limpar os dados, removendo pontos pouco confiáveis, mas sem restringir demais as possibilidades de habitats que a espécie pode ocupar. Lemrbe-se da máximo: garbage in, garbage out.
Agora é a sua vez de por a mão na massa. Escolha uma espécie e prepare os dados para a nossa próxima aula, aonde selecionaremos dados ambientais para gerar modelos. Mantenha um registro escrito do que você está fazendo, isso ajudará você na hora de escrever os métodos do artigo final.